package com.autoerp.dao.jdbc.servico;

import java.sql.Connection;
import java.util.List;

import org.mentabean.BeanSession;

import com.autoerp.dao.servico.ServicoDAO;
import com.autoerp.model.servico.ServicoEntity;

/**
 * 
 * Classe ServicoDAOJdbc, implementação da interface ServicoDAO.
 */

public class ServicoDAOJdbc implements ServicoDAO {

	/** The session. */
	private BeanSession session;

	/** The conn. */
	private Connection conn;

	/**
	 * Instantiates a new serviço dao jdbc.
	 * 
	 * @param session
	 *            the session
	 */
	public ServicoDAOJdbc(BeanSession session) {
		this.session = session;
		this.conn = session.getConnection();

	}

	/**
	 * Excluir o serviço atraves do seu identificador.
	 * 
	 * @param id_servico
	 *            identificador do servico
	 */
	public void deletar(Integer id_servico) {
		// Cria instancia do servico
		ServicoEntity servico = new ServicoEntity();
		// Seta identificador do servico
		servico.setId_servico(id_servico);

		// Busca e exclui o servico
		if (session.load(servico)) {
			session.delete(servico);
		} else {
			throw new IllegalStateException("Servico não encontrado!");
		}

	}

	/**
	 * Localizar o serviço atraves do seu identificador.
	 * 
	 * @param id_servico
	 *            identificador do serviço
	 * @return instancia do serviço
	 */
	public ServicoEntity buscarPorId(Integer id_servico) {
		// Cria instancia do servico
		ServicoEntity servico = new ServicoEntity();
		// Seta identificador do servico
		servico.setId_servico(id_servico);

		// Busca e retorna o servico
		if (session.load(servico)) {
			return servico;
		}

		// Retorna null se o servico nao for encontrado
		return null;
	}

	/**
	 * Localizar o serviço atraves do seu nome.
	 * 
	 * @param de_nome
	 *            Nome do serviço
	 * @return instancia do serviço
	 */
	public ServicoEntity buscarPorNome(String de_nome) {
		// Cria instancia do servico
		ServicoEntity servico = new ServicoEntity();
		// Seta nome do servico
		servico.setDe_nome(de_nome);

		List<ServicoEntity> list = buscarServico(servico);

		// Se a lista de servicos for null ou vazia retorna null
		if (list == null || list.isEmpty()) {

			return null;

		} else if (list.size() > 1) {
			// Se a lista de servicos for maior que 1 seta mensagem
			throw new IllegalStateException(
					"Existe mais de um servico com o mesmo nome!");

		} else {
			// Retorna o servico da posicao 0 da lista
			return list.get(0);
		}

	}

	/**
	 * Localizar serviço
	 * 
	 * @param servicoEntity
	 *            instancia do serviço
	 * @return Lista de serviço
	 */
	public List<ServicoEntity> buscarServico(ServicoEntity servico) {
		/// Retorna lista de servicos encontrados.
		return session.loadList(servico);
	}
	
	/**
	 * Localizar Lista de serviços.
	 *
	 * @return Lista de serviços
	 */
	public List<ServicoEntity> buscarListaServicos(){
		// Cria instancia de servico
		ServicoEntity servico = new ServicoEntity();
		// Retorna lista de servicos.
		return session.loadList(servico);

		}

	/**
	 * Salvar o serviço no banco de dados.
	 *
	 * @param servicoEntity instancia do serviço
	 */
	public void salvar(ServicoEntity servicoEntity) {
		// Salva servico no banco
		session.insert(servicoEntity);

	}

}
